package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.common.ISubject;
import pe.com.cotelasa.scp.controlador.backingBean.BKComponenteDocumento;
import pe.com.cotelasa.scp.dominio.common.helper.SelectOneMenuHelper;
import pe.com.cotelasa.scp.controlador.backingBean.BKContacto;
import pe.com.cotelasa.scp.controlador.backingBean.BKSede;
import pe.com.cotelasa.scp.controlador.backingBean.BKUbigeo;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.controlador.comando.ComandoVer;
import pe.com.cotelasa.scp.controlador.comando.IComando;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.TIPO_CONTACTO;
import pe.com.cotelasa.scp.dominio.modelo.SedeModel;
import pe.com.cotelasa.scp.dominio.service.IServicioSede;
import pe.com.cotelasa.scp.dominio.service.IServicioEmpresa;
import pe.com.cotelasa.scp.dominio.service.IServicioProveedor;
import pe.com.cotelasa.scp.dominio.service.IServicioCliente;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoContacto;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ModelExcepcion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioContacto;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoDocumento;
import pe.com.cotelasa.scp.entidad.Contacto;
import pe.com.cotelasa.scp.entidad.Sede;
import pe.com.cotelasa.scp.entidad.Ubigeo;
import pe.com.cotelasa.scp.entidad.Empresa;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.CorrelativoDocumento;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.entidad.TipoContacto;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@Named(value = "MBSede")
@Scope("request")
public class MBSede extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static final long serialVersionUID = -7395145664157761627L;
    private static Logger logger = Logger.getLogger(MBSede.class);
    @Inject
    private BKSede bkSede;
    @Inject
    private BKUbigeo bkUbigeo;
    @Inject
    private BKContacto bkContacto;
    @Inject
    private BKComponenteDocumento bKComponenteDocumento;
    @Inject
    private IServicioContacto servicioContacto;
    @Inject
    private IServicioSede servicioSede;
    @Inject
    private IServicioTipoContacto servicioTipoContacto;
    @Inject
    private MBUbigeo mbUbigeo;
    @Inject
    private IServicioTipoDocumento servicioDocumento;
    @Autowired
    private SedeModel sedeModel;
    private Collection<IObserver> listaObservadores = new ArrayList<IObserver>();
    @Autowired
    BKSession session;

    public MBSede() {
    }

    public void buscarSedes() {

        bkSede.getSedeBusqueda().setEsAlmacen((short) (bkSede.isAlmacenBusqueda() ? 1 : 0));
        bkSede.getSedeBusqueda().setIdEmpresa(session.getEmpresa());
        bkSede.getSedeBusqueda().setEsTienda((short) (bkSede.isTiendaBusqueda() ? 1 : 0));
        try {
            bkSede.setListaSedesActivas(sedeModel.obtenerListaSedes(bkSede.getSedeBusqueda()));
        } catch (ModelExcepcion e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion.");
            logger.error(e.getMessage(), e);
        }

    }

    public String mostrarMantenimiento() {
        try {
            bkSede.setSedeBusqueda(new Sede());
            bkSede.setListaEmpresas(SelectOneMenuHelper.listaEmpresasConsulta(sedeModel.obtenerListaEmpresasActivas()));
            
            bkContacto.setEstaTipoComtacto(false);
            bkUbigeo.inicializarValores(null, null, false, null);
            bkContacto.setTipoContacto(TIPO_CONTACTO.CONTACTO.getValor());
            bkSede.setTipoContactoForumlario(servicioTipoContacto.conseguirTipoContactoPorId(bkContacto.getTipoContacto()));
            bkContacto.setListaContacto(new ArrayList<Contacto>());
            bkContacto.setListaContactoEditar(new ArrayList<Contacto>());
            bkSede.setListaSedesActivas(null);            
            bkSede.setVerFormulario(false);
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        } catch (ModelExcepcion e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.Sede.URL_LISTA_SEDES;
    }

    public String nuevo() {
        this.bkSede.setComando(new ComandoGuardar(this));
        mbUbigeo.addObserver(this);

        bkSede.setSedeFormulario(new Sede());
        cargaInicial();

        return URLPaginacion.Sede.URL_FORMULARIO_SEDE;
    }

    public String editar() {
        this.bkSede.setComando(new ComandoActualizar(this));
        mbUbigeo.addObserver(this);
        cargaInicial();
        try {
            Sede sede = servicioSede.conseguirSedeConUbigeo(bkSede.getSedeFormulario().getId());
            bkSede.setAlmacenFormulario(sede.getEsAlmacen() == 1 ? true : false);
            bkSede.setTiendaFormulario(sede.getEsTienda() == 1 ? true : false);
            bkUbigeo.inicializarValores(sede.getIdUbigeo().getIdPais(), sede.getIdUbigeo(), false, sede.getDescUbicacion());

            Contacto contactoBuscar = new Contacto();
            contactoBuscar.setIdTipoContacto(bkSede.getTipoContactoForumlario());
            contactoBuscar.setIdSede(sede);


            bkContacto.setListaContacto((List<Contacto>) servicioContacto.buscarContactosPorSedeYTipo(contactoBuscar));
            for (Contacto contacto : bkContacto.getListaContacto()) {
                System.out.println("id de contacto: "+contacto.getIdTipoContacto().getId());
                bkContacto.getListaContactoEditar().add(contacto);
            }

            bKComponenteDocumento.getListaCorrelativoDocumentoEditar().addAll(sede.getCorrelativoDocumentoCollection());
            System.out.println("lista de correlativos: " + bKComponenteDocumento.getListaCorrelativoDocumentoEditar());
            for (CorrelativoDocumento correlativo : bKComponenteDocumento.getListaCorrelativoDocumentoEditar()) {
                if (correlativo.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()
                        && correlativo.getIdTipoDocumento().getEsGeneral() != 'G') {
                    //System.out.println("documento: "+correlativo.getIdTipoDocumento().getNombre());
                    bKComponenteDocumento.getListaCorrelativoDocumento().add(correlativo);
                }

            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            System.err.println(e);
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }

        return URLPaginacion.Sede.URL_FORMULARIO_SEDE;
    }

    @Override
    public String ver() {
        editar();
        bkSede.setVerFormulario(true);
        return URLPaginacion.Sede.URL_VER_SEDE;
    }

    @Override
    public String guardar() {
        Sede sede = bkSede.getSedeFormulario();

        sede.setUsrCreacion(session.getUsuario().getUsuario());
        sede.setFecCreacion(new Date());
        sede.setSedeAdministradora(0);

        sede.setIdEmpresa(session.getEmpresa());

        sede.setEsAlmacen((short) (bkSede.isAlmacenFormulario() ? 1 : 0));
        sede.setEsTienda((short) (bkSede.isTiendaFormulario() ? 1 : 0));
        String Url = null;

        try {

            for (Contacto contacto : bkContacto.getListaContacto()) {
                contacto.setIdTipoContacto(bkSede.getTipoContactoForumlario());
                contacto.setIdSede(sede);
                //servicioContacto.guardarContacto(contacto);
            }

            for (CorrelativoDocumento correlativoDocumento : bKComponenteDocumento.getListaCorrelativoDocumento()) {
                correlativoDocumento.setIdsede(sede);
                //servicioContacto.guardarContacto(contacto);
            }

            sede.setContactoCollection(bkContacto.getListaContacto());
            sede.setCorrelativoDocumentoCollection(bKComponenteDocumento.getListaCorrelativoDocumento());
            servicioSede.guardarSede(sede);

            mostrarMensaje("Se guardo los datos de la sede satisfactoriamente.");
            buscarSedes();
            Url = URLPaginacion.Sede.URL_LISTA_SEDES;
            //Url = mostrarMantenimiento();

        } catch (ServiceException e) {
            Url = URLPaginacion.Sede.URL_FORMULARIO_SEDE;
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            System.err.println(e);
            logger.error(e.getMessage(), e);
        }
        return Url;



    }

    @Override
    public String actualizar() {
        String Url = null;
        try {
            Sede sede = bkSede.getSedeFormulario();

            sede.setUsrModificacion(session.getUsuario().getUsuario());
            sede.setFecModificacion(new Date());
            sede.setEsAlmacen((short) (bkSede.isAlmacenFormulario() ? 1 : 0));
            sede.setEsTienda((short) (bkSede.isTiendaFormulario() ? 1 : 0));

            for (Contacto contacto : bkContacto.getListaContactoEditar()) {
                contacto.setIdTipoContacto(bkSede.getTipoContactoForumlario());
                if (contacto.getId() == null) {
                    contacto.setIdSede(sede);
                }
            }

            for (CorrelativoDocumento correlativoDocumento : bKComponenteDocumento.getListaCorrelativoDocumentoEditar()) {
                if (correlativoDocumento.getId() == null) {
                    correlativoDocumento.setIdsede(sede);
                }
                //servicioContacto.guardarContacto(contacto);
            }

            sede.setContactoCollection(bkContacto.getListaContactoEditar());
            sede.setCorrelativoDocumentoCollection(bKComponenteDocumento.getListaCorrelativoDocumentoEditar());
            servicioSede.actualizarSede(sede);
            mostrarMensaje("Se actualizo los datos de la sede satisfactoriamente.");
            buscarSedes();
            Url = URLPaginacion.Sede.URL_LISTA_SEDES;
            //Url = mostrarMantenimiento();
        } catch (ServiceException e) {
            Url = URLPaginacion.Sede.URL_FORMULARIO_SEDE;
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return Url;

    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        Sede sede = bkSede.getSedeSeleccionado();
        sede.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
        sede.setUsrModificacion(session.getUsuario().getUsuario());
        sede.setFecModificacion(new Date());

        try {
            servicioSede.actualizarSede(sede);
            bkSede.setListaSedesActivas(servicioSede.listarSedesActivos());
            buscarSedes();
            mostrarMensaje("Se elimino la sede correctamente");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    @Override
    public String aceptar() {
        try {
            servicioSede.actualizarSede(bkSede.getSedeFormulario());
            bkSede.setSedeFormulario(servicioSede.conseguirSedePorId(1));
            bkSede.setListaSedesActivas(servicioSede.listarSedesActivos());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.Sede.URL_LISTA_SEDES;
    }

    @Override
    public String retroceder() {
        return URLPaginacion.Sede.URL_LISTA_SEDES;
    }

    @Override
    public String cancelar() {
        return URLPaginacion.Sede.URL_LISTA_SEDES;
        //return mostrarMantenimiento();
    }

    @Override
    public void actualizarObservador(Object object) {
        Map<String, Object> datos = (Map<String, Object>) object;
        bkSede.getSedeFormulario().setDescUbicacion((String) datos.get("descripcionUbigeo"));
        bkSede.getSedeFormulario().setIdUbigeo((Ubigeo) datos.get("ubigeo"));
    }

    public void cargaInicial() {
        try {
            bKComponenteDocumento.inicializarValores();
            bKComponenteDocumento.setListaTipoDocumento((List) servicioDocumento.listarTipoDocumentoDeSede());
        } catch (ServiceException e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }
    }
    /**
     * ***************************** COMPONENTE DIRECCION
     * ********************************************
     */
}
